/**
 ******************************************************************************
 * @file           : bsp_iic.h
 * @brief          : Hardware I2C Driver Header File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * 硬件I2C驱动程序头文件（基于STM32 HAL库）
 * 提供标准I2C主机功能
 * 支持7位/10位地址模式
 * 支持标准速度(100kHz)和快速模式(400kHz)
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_IIC_H
#define __BSP_IIC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./BSP/IIC/bsp_iic_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief I2C错误码枚举
 */
typedef enum
{
    IIC_OK = 0,                 /*!< 操作成功 */
    IIC_ERROR_PARAM,            /*!< 参数错误 */
    IIC_ERROR_TIMEOUT,          /*!< 超时错误 */
    IIC_ERROR_BUSY,             /*!< 总线忙 */
    IIC_ERROR_NACK,             /*!< 接收到NACK */
    IIC_ERROR_AF,               /*!< 应答失败 */
    IIC_ERROR_BERR,             /*!< 总线错误 */
    IIC_ERROR_ARLO,             /*!< 仲裁丢失 */
    IIC_ERROR_OVR,              /*!< 过载/欠载 */
    IIC_ERROR                   /*!< 未知错误 */
} IIC_Error_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void iic_init(void);                                            /*!< I2C初始化 */
void iic_deinit(void);                                          /*!< I2C反初始化 */

/* 寄存器读写函数 */
IIC_Error_e iic_write_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t data);  /*!< 写单个寄存器 */
IIC_Error_e iic_read_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data);  /*!< 读单个寄存器 */

/* 多字节读写函数 */
IIC_Error_e iic_write_bytes(uint8_t dev_addr, uint8_t reg_addr, const uint8_t *buf, uint16_t len);  /*!< 写多字节 */
IIC_Error_e iic_read_bytes(uint8_t dev_addr, uint8_t reg_addr, uint8_t *buf, uint16_t len);         /*!< 读多字节 */

/* 主机发送/接收函数（无寄存器地址） */
IIC_Error_e iic_master_transmit(uint16_t dev_addr, const uint8_t *data, uint16_t len);  /*!< 主机发送数据 */
IIC_Error_e iic_master_receive(uint16_t dev_addr, uint8_t *data, uint16_t len);         /*!< 主机接收数据 */

/* 设备检测函数 */
IIC_Error_e iic_is_device_ready(uint16_t dev_addr, uint8_t retry);  /*!< 检查设备就绪 */
void iic_scan_bus(void);                                            /*!< 扫描I2C总线 */

/* 错误处理函数 */
const char* iic_get_error_string(IIC_Error_e error);            /*!< 获取错误描述 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_IIC_H */
